#类的定义
# class A():
#     pass
#
# class B:
#     pass
#
# class C(object):
#     pass

#python3中三种定义方式，都没有区别，默认你就会继承object类
#新式类与经典类
#继承了object类的类都属于新式类， 没有继承object类的类属于经典类
#python3  --》 新式类
#python2  A、B两类都属于经典类，只有C是新式类

class Bus317(object):
    #类属性  --描述信息
    line = "317"

    #方法 -- 》行为
    def run(self, flag):
        print("bus317 is run")
        if flag == 0:
            print("从农大到长华小区")
        else:
            print("从长华小区到农大")

#创建了一个对象
#实例化
bus01 = Bus317()
bus02 = Bus317()

# #打印类和实例的内存
# print(id(Bus317), id(bus01), id(bus02))
# #类和实例都有单独的命名空间
#
# #查看对象的属性或方法
# print(dir(bus01))
# print(bus01.line)
# bus01.run(0)
# bus02.run(1)
#
# #直接用类去访问属性
print(Bus317.line)

#######__init__方法
#实例对象的构造方法（初始化方法）
#实例化对象的时候会自动调用__init__方法

# class Bus317(object):
#     #类属性  --描述信息
#     #公共属性
#     line = "317"
#
#     def __init__(self,pro,line):
#         # print("this is init")
#         self.pro1 = pro
#         self.line = line
#
#     #方法 -- 》行为
#     def run(self, flag):
#         print("bus317 is run")
#         if flag == 0:
#             print("从农大到长华小区")
#         else:
#             print("从长华小区到农大")

#定义了__init__构造方法，并且构造方法需要传递一个参数
#实例化的时候传递参数给__init__方法
# bus01 = Bus317("byd","318")
# bus02 = Bus317("futian","319")
# # print(dir(bus01))
# # print(bus01.pro1)
# # print(bus02.pro1)
#
# #查看类空间有哪些东西
# print(Bus317.__dict__)
# #查看实例空间有哪些东西
# print(bus01.__dict__)
# print(bus02.__dict__)
# print(bus01.line, bus01.pro1)
# print(bus02.line, bus02.pro1)
# print(Bus317.pro1)
#############类空间和实例空间
#创建类的时候就会生成类空间（单独的内存区域）
#实例化对象时就会生成实例空间，不同的实例之间，空间是独立的
#实例查找属性方法时候，会先在实例空间去查找，找不到就去类空间查找
#类空间找不到就去父类空间查找
#bus01.xx -- 查找xx属性--
# 先在它自己的实例空间查找--找不到去Bus317里查找-- 找不到再去object  --再找不到就报错

#由下往上依次查找

################__new__方法
#创建实例， 一般情况下不需要重写
# class Bus317(object):
#     #类属性  --描述信息
#     #公共属性
#     line = "317"
#
#     def __init__(self,pro,line):
#         print("this is init")
#         self.pro1 = pro
#         self.line = line
#
#     # *args   **kwargs  为了更加通用
#     #cls接收到的参数就是当前类（Bus317）
#     def __new__(cls, *args, **kwargs):
#         print("this is new method")
#         return "new"
#         #返回父类object.__new__方法通过当前类创建的对象
#         #return object.__new__(cls)
#
#     #方法 -- 》行为
#     def run(self, flag):
#         print("bus317 is run")
#         if flag == 0:
#             print("从农大到长华小区")
#         else:
#             print("从长华小区到农大")
#
# #实例化
# bus01 = Bus317("byd","318")
# print(bus01.line)

#######
# 总结
# __new__是创建实例的方法,是一个静态方法
# __init__是创建好的实例，进行初始化工作的方法，是一个实例方法
#
# 1、__new__方法必须传入一个参数(cls)，代表当前类
# 2、__new__必须返回一个实例化的对象
# 3、__init__的self就表示__new__返回的实例，__init__对这个实例进行初始化工作
# 4、子类没有__new__，会去找父类的__new__
# 5、新式类才有__new__
# 6、如果实例化对象和本身class不一致，__init__不会执行


class Student:
    school = "nongda"

    def __init__(self,name,age,grade):
        self.name = name
        self.age = age
        self.grade = grade
    def sum_grade(self):
        # sum = 0
        # for i in self.grade.values():
        #     sum += i
        # return sum
        return sum(self.grade.values())

    def avg_grade(self):
        return self.sum_grade()/len(self.grade.values())

huyuxuan = Student("hyx",18,{"yuwen":90,"math":80})
llf = Student("llf",18,{"yuwen":80,"math":100})

print(huyuxuan.sum_grade())
print(llf.avg_grade())

